package questions

import (
	"fmt"
	"time"
)

// QuestionType 题目类型
type QuestionType string

const (
	SingleChoice   QuestionType = "singleChoice"   // 单选题
	MultipleChoice QuestionType = "multipleChoice" // 多选题
	FillBlank      QuestionType = "fillBlank"      // 填空题
	TrueFalse      QuestionType = "trueFalse"      // 判断题
	ShortAnswer    QuestionType = "shortAnswer"    // 简答题
	Rating         QuestionType = "rating"         // 评分题
)

// ParseQuestionType 将字符串转换为QuestionType，如果不是有效类型则返回错误
func ParseQuestionType(s string) (QuestionType, error) {
	switch QuestionType(s) {
	case SingleChoice, MultipleChoice, FillBlank, TrueFalse, ShortAnswer, Rating:
		return QuestionType(s), nil
	default:
		return "", fmt.Errorf("无效的题目类型: %s", s)
	}
}

// String 返回QuestionType的字符串表示
func (qt QuestionType) String() string {
	return string(qt)
}

// IsValid 检查QuestionType是否为有效类型
func (qt QuestionType) IsValid() bool {
	_, err := ParseQuestionType(string(qt))
	return err == nil
}

// BaseQuestion 基础题目结构，实现Question接口的通用字段
type BaseQuestion struct {
	ID          string       `json:"id"`                    // 题目ID
	Type        QuestionType `json:"type"`                  // 题目类型
	Title       string       `json:"title"`                 // 题目标题
	Description string       `json:"description,omitempty"` // 题目描述
	Analysis    string       `json:"analysis"`              // 题目解析
	Required    bool         `json:"required"`              // 是否必填
	Order       int          `json:"order"`                 // 排序序号
	Tags        []string     `json:"tags,omitempty"`        // 知识点标签
	Category    string       `json:"category,omitempty"`    // 题目分类
	Enabled     bool         `json:"enabled"`               // 是否启用
	EnabledAt   *time.Time   `json:"enabledAt,omitempty"`   // 启用时间
	DisabledAt  *time.Time   `json:"disabledAt,omitempty"`  // 禁用时间
	CreatedAt   *time.Time   `json:"createdAt"`             // 创建时间
	UpdatedAt   *time.Time   `json:"updatedAt"`             // 更新时间
	CreatedBy   string       `json:"createdBy"`             // 创建者
	UpdatedBy   string       `json:"updatedBy,omitempty"`   // 更新者
}

// GetID 获取题目ID
func (bq BaseQuestion) GetID() string {
	return bq.ID
}

// GetType 获取题目类型
func (bq BaseQuestion) GetType() QuestionType {
	return bq.Type
}

// GetTitle 获取题目标题
func (bq BaseQuestion) GetTitle() string {
	return bq.Title
}

// GetDescription 获取题目描述
func (bq BaseQuestion) GetDescription() string {
	return bq.Description
}

// GetAnalysis 获取题目解析
func (bq BaseQuestion) GetAnalysis() string {
	return bq.Analysis
}

// IsRequired 获取是否必填
func (bq BaseQuestion) IsRequired() bool {
	return bq.Required
}

// GetOrder 获取排序序号
func (bq BaseQuestion) GetOrder() int {
	return bq.Order
}

// GetTags 获取知识点标签
func (bq BaseQuestion) GetTags() []string {
	return bq.Tags
}

// GetCategory 获取题目分类
func (bq BaseQuestion) GetCategory() string {
	return bq.Category
}

// IsEnabled 判断题目是否启用
func (bq BaseQuestion) IsEnabled() bool {
	return bq.Enabled
}

// GetEnabledAt 获取启用时间
func (bq BaseQuestion) GetEnabledAt() *time.Time {
	return bq.EnabledAt
}

// GetDisabledAt 获取禁用时间
func (bq BaseQuestion) GetDisabledAt() *time.Time {
	return bq.DisabledAt
}

// GetCreatedAt 获取创建时间
func (bq BaseQuestion) GetCreatedAt() *time.Time {
	return bq.CreatedAt
}

// GetUpdatedAt 获取更新时间
func (bq BaseQuestion) GetUpdatedAt() *time.Time {
	return bq.UpdatedAt
}

// GetCreatedBy 获取创建者
func (bq BaseQuestion) GetCreatedBy() string {
	return bq.CreatedBy
}

// GetUpdatedBy 获取更新者
func (bq BaseQuestion) GetUpdatedBy() string {
	return bq.UpdatedBy
}
